package com.qingcloud.base.api.remote.admin;

import com.qingcloud.base.api.remote.admin.factory.AdminApiFallbackFactory;
import com.qingcloud.base.constant.AppNameConstant;
import com.qingcloud.base.pojo.AjaxResult;
import com.qingcloud.base.remote.admin.MessageEventSaveRule;
import com.qingcloud.base.remote.admin.MessageEventTypeField;
import com.qingcloud.base.remote.pojo.*;
import io.swagger.annotations.ApiOperation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 通用管理平台远程调用API接口
 */
@FeignClient(contextId = "adminApi", path = "backend", value = AppNameConstant.APP_ADMIN, fallbackFactory = AdminApiFallbackFactory.class)
public interface AdminApi {

    /**
     * 根据组织ID查询用户
     *
     * @param orgId 组织ID
     * @return 用户信息
     */
    @GetMapping(value = "api/user/org/{orgId}")
    List<SimpleUserDTO> findUserByOrgId(@PathVariable("orgId") String orgId);

    /**
     * 通过用户ID列表批量查询用户信息
     *
     * @param idList 用户ID列表
     * @return 用户信息列表
     */
    @PostMapping(value = "api/user/ids")
    List<SimpleUserDTO> findUserByIdList(@RequestBody Collection<String> idList);

    /**
     * 按账号列表批量查询用户信息
     *
     * @param userNameList 用户账号
     * @return 用户信息
     */
    @PostMapping(value = "api/user/names")
    List<SimpleUserDTO> findByUsernameList(@RequestBody Collection<String> userNameList);

    /**
     * 根据用户ID查询用户身份信息
     *
     * @param userId 用户ID
     * @return 身份信息
     */
    @GetMapping(value = "api/user/flag/{userId}")
    UserFlagDTO findUserFlag(@PathVariable("userId") String userId);

    /**
     * 按照登录名和姓名模糊查询所有用户
     *
     * @param name 模糊名称，例如ad
     * @return 用户列表
     */
    @GetMapping(value = "api/user/like/{name}")
    List<SimpleUserDTO> findUserLike(@PathVariable("name") String name);


    /**
     * 根据用户名获取用户登录信息  包括 ROLE
     *
     * @param userName 可以为 username ,workemail ,mobileno
     * @return
     */
    @GetMapping(value = "api/findUser/{userName}")
    LoginUserDTO findUserByName(@PathVariable("userName") String userName);

    /**
     * 根据用户ID 获取用户信息 不包括 ROLE
     *
     * @param userId
     * @return
     */
    @GetMapping(value = "api/findUserByUserId/{userId}")
    LoginUserDTO findUserByUserId(@PathVariable("userId") String userId);

    @Deprecated
    @PostMapping("api/findUserById")
    LoginUserDTO findUserById(@RequestParam("userId") String userId);

    /**
     * 权限管理平台登录接口
     *
     * @param loginRequest 登录请求对象
     * @return 登录结果
     */
    @PostMapping("api/loginAllPlatforms")
    LoginUserDTO loginAllPlatforms(@RequestBody LoginRequest loginRequest);

    /**
     * 权限管理平台订单接口
     *
     * @param orderParam 登录请求对象
     * @return 登录结果
     */
    @PostMapping("api/findOrdersByBusinessType")
    List<SysOrderDTO> getOrders(@RequestBody OrderParam orderParam);

    /**
     * 批量查询监测点项目信息
     *
     * @param sidSet 监测点编号集合
     * @return 监测点项目信息
     */
    @PostMapping(value = "api/station/order")
    List<StationProjectInfoDTO> findStationOrderInfo(@RequestBody Collection<String> sidSet);

    /**
     * 权限管理平台功能接口
     *
     * @param functionRequest 登录请求对象
     * @return 登录结果
     */
    @PostMapping("api/getFunctionByUserId")
    Map<String, Object> getFunctionByUserId(@RequestBody FunctionRequest functionRequest);


    /**
     * 获取用户功能清单明细
     *
     * @param functionRequest
     * @return
     */
    @PostMapping("api/function/list")
    List<FunctionDTO> getFunctionList(@RequestBody FunctionRequest functionRequest);

    /**
     * 根据用户ID和菜单类别获取菜单
     *
     * @param userId
     * @param menuType
     * @return
     */
    @GetMapping(value = "api/getMenuByUserAndType/{userId}/{menuType}")
    List<MenuDTO> getMenuByUserAndType(@PathVariable("userId") String userId, @PathVariable("menuType") String menuType);

    /**
     * 修改用户密码
     */
    @PutMapping(value = "api/user/pwd/change")
    AjaxResult changePassword(@RequestBody ChangePwdParam param);

    /**
     * 权限管理平台功能接口
     *
     * @param functionRequest 登录请求权限编码
     * @return 登录结果
     */
    @PostMapping("api/function/code")
    public List<String> getAllFunctionCode(@RequestBody FunctionRequest functionRequest);

    /**
     * 权限管理平台功能接口  （接口待检查）
     *
     * @param functionRequest 登录请求对象
     * @return 登录结果
     */
//    @PostMapping("api/getAllMenu")
//    List<MenuDTO> getAllMenu(@RequestBody FunctionRequest functionRequest);

    /**
     * 查询用户任务管理权限的所有组织ID
     *
     * @param userId 用户ID
     * @return 组织ID集合
     */
    @GetMapping(value = "api/taskorg/ids")
    Set<String> findUserTaskOrgIds(@RequestParam("userId") String userId);

    /**
     * 查询用户任务所属组织
     *
     * @param userId 用户ID
     * @return 组织ID
     */
    @GetMapping(value = "api/user/taskorg")
    String findTaskOrg(@RequestParam("userId") String userId);

    /**
     * 查询网格员用户
     *
     * @param gridUserParam 参数
     * @return 网格员用户
     */
    @PostMapping(value = "api/grid/user")
    List<GridUserDTO> findGridUser(@RequestBody GridUserParam gridUserParam);

    /**
     * 用户数据权限监测点编号查询
     *
     * @param userId   用户ID
     * @param workType 业务种类
     * @return 监测点编号
     */
    @GetMapping(value = "api/station/ids")
    Set<String> getStationDataPermissions(@RequestParam("userId") String userId,
                                          @RequestParam("workType") String workType);

    /**
     * 获取用户可读的设备编号
     *
     * @param userId       用户ID
     * @param businessType 业务种类
     * @return 设备编号
     */
    @GetMapping(value = "api/equipment/ids")
    Set<String> findReadableEquipment(@RequestParam("userId") String userId,
                                      @RequestParam("businessType") Integer businessType);

    /**
     * 查询项目下监测点信息
     *
     * @param projectId    项目ID
     * @param businessType 业务种类
     * @return 监测点项目信息
     */
    @GetMapping(value = "api/project/station")
    List<StationProjectInfoDTO> findOrderStation(@RequestParam("projectId") String projectId,
                                                 @RequestParam("businessType") Integer businessType);

    /**
     * 查询项目下设备信息
     *
     * @param projectId 项目id
     * @return 项目设备信息
     */
    @GetMapping(value = "api/project/equipment")
    List<EquipmentProjectInfoDTO> findOrderEquipmentId(@RequestParam("projectId") String projectId);

    /**
     * 根据设备编号批量查询设备信息
     *
     * @param equipmentIds 设备编号集合
     * @return 设备信息
     */
    @PostMapping(value = "api/equipment/info")
    List<EquipmentProjectInfoDTO> findEquipmentInfo(@RequestBody Collection<String> equipmentIds);

    /**
     * 批量查询客户信息
     *
     * @param orgInfoParam 查询客户信息参数
     * @return
     */
    @PostMapping(value = "api/org")
    List<SysOrgInfo> findOrgInfo(@RequestBody OrgInfoParam orgInfoParam);

    /**
     * 查询子客户信息
     *
     * @param parentId 父客户ID
     */
    @GetMapping(value = "api/org/child/{parentId}")
    List<SysOrgInfo> findOrgChild(@PathVariable("parentId") String parentId);

    /**
     * 获取权限平台所有的数据源
     *
     * @return 数据源列表
     */
    @GetMapping("api/getAllDatasource")
    List<DsDTO> getAllDatasource();

    /**
     * 根据数据源ID查询数据库类型的数据源详细信息
     *
     * @param dsId 数据源ID
     * @return 数据库数据源详细信息
     */
    @GetMapping("api/getDatabaseByDsId/{dsId}")
    DsDatabaseDTO getDatabaseByDsId(@PathVariable("dsId") Integer dsId);

    /**
     * 查询数据源所有信息接口
     *
     * @return 数据源所有信息列表
     */
    @GetMapping("api/findAllDsDb")
    List<DsDTO.DsAllInfoDTO> findDsAllInfo();

    /**
     * 获取用户区域信息
     *
     * @return
     */
    @GetMapping("api/user/domains/{userId}")
    List<UserDomainDTO> getUserDomains(@PathVariable("userId") String userId);

    /**
     * 所有产品模型列表
     *
     * @return
     */
    @GetMapping("api/selectAllProductList")
    List<PageProductListVO> selectAllProductList();

    /**
     * 根据产品类型查询设备id列表
     *
     * @return
     */
    @GetMapping("api/equipmentByProductType/{productType}")
    List<String> equipmentByProductType(@PathVariable("productType") String productType);

    /**
     * 根据产品类型id查询指令模型菜单
     *
     * @return
     */
    @GetMapping("api/productCommandClassifyTree/{productTypeId}")
    List<ApiTreeNode> productCommandClassifyTree(@PathVariable("productTypeId") Integer productTypeId);

    /**
     * 事件通知配置查询
     *
     * @return 事件通知配置列表集合
     */
    @GetMapping("api/eventNoticeConfigList")
    List<EventMessageInfoVO> eventNoticeConfigList();

    /**
     * 事件类型字段配置
     *
     * @param typeId 事件类型ID
     * @return
     */
    @GetMapping("api/event/fields/{typeId}")
    List<MessageEventTypeField> findEventTypeField(@PathVariable("typeId") Integer typeId);

    /**
     * 根据事件编码查询事件规则
     */
    @GetMapping("api/event/rules/{eventCode}")
    MessageEventSaveRule findEventRules(@PathVariable("eventCode") String eventCode);

    /**
     * 新增修改应用信息
     *
     * @param businessApp 应用信息
     * @return
     */
    @PostMapping(value = "api/business/addOrUpdate")
    public AjaxResult addOrUpdateBusinessApp(@RequestBody BusinessApp businessApp);

    /**
     * 删除应用
     */
    @GetMapping("api/business/{origin}/{bizCode}")
    public AjaxResult deleteBusinessApp(@PathVariable("origin") Integer origin,
                                        @PathVariable("bizCode") String bizCode);

    /**
     * 应用权限过滤
     *
     * @param userId
     * @return
     */
    @GetMapping("api/business/filter/{userId}")
    public List<BusinessTypeDTO> businessAppFilter(@PathVariable("userId") String userId);

    /**
     * 邢增功能
     *
     * @param functionDTO
     * @return
     */
    @PostMapping("api/function/updateFunction")
    public AjaxResult updateFunction(@RequestBody FunctionDTO functionDTO);

    /**
     * 修改功能
     *
     * @param functionDTO
     * @return
     */
    @PostMapping("api/function/addFunction")
    public AjaxResult addFunction(@RequestBody FunctionDTO functionDTO);


    @PostMapping("api/function/addOrUpdateFunction")
    public AjaxResult addOrUpdateFunction(@RequestBody FunctionDTO functionDTO);

    /**
     * 删除功能
     *
     * @param functionIds
     * @return
     */
    @PostMapping("api/delFunction/{functionIds}")
    AjaxResult delFunction(@PathVariable("functionIds") String functionIds);

    @GetMapping("api/business/findByBizId/{origin}/{bizCode}")
    public AjaxResult findByBizId(@PathVariable("origin") Integer origin, @PathVariable("bizCode") String bizCode);

    /**
     * 查询子function
     */
    @GetMapping("api/function/child/{parentId}")
    List<FunctionDTO> getChildFunction(@PathVariable("parentId") String parentId);

    @GetMapping("api/app/owner/{appId}")
    SimpleUserDTO findAppOwner(@PathVariable("appId") Integer appId);

    @PostMapping("api/app/functions")
    Map<String, Set<String>> getAppFunctionCode(@RequestBody AppFunctionParam param);

    @PostMapping("api/loginstatus/{userId}")
    AjaxResult loginStatus(@PathVariable("userId") String userId);

    /**
     * 获取我参与的应用ID
     */
    @PostMapping("api/app/part/{userId}")
    Set<Integer> getMyPartAppId(@PathVariable("userId") String userId);

}
